package com.xuecheng.base.result;

import lombok.Data;
import lombok.ToString;

/**
 * @description 响应
 * @author 勾新杰
 * @version 1.0
 * @date 2024/12/19 21:40
 */
@Data
public class RestResponse<T> {

    /**
     * 响应编码,0为正常,-1错误
     */
    private int code;

    /**
     * 响应提示信息
     */
    private String msg;

    /**
     * 响应内容
     */
    private T result;

    /**
     * 默认构造方法
     */
    RestResponse() {
        this(0, "success");
    }

    /**
     * 构造方法
     *
     * @param result 响应内容
     */
    RestResponse(T result) {
        this(0, "success", result);
    }

    /**
     * 构造方法
     *
     * @param code 响应编码
     * @param msg  响应提示信息
     */
    RestResponse(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 构造方法
     *
     * @param code   响应编码
     * @param msg    响应提示信息
     * @param result 响应内容
     */
    RestResponse(int code, String msg, T result) {
        this.code = code;
        this.msg = msg;
        this.result = result;
    }

    /**
     * 错误信息的封装
     *
     * @param msg 错误信息
     * @param <T> 数据泛型
     * @return RestResponse
     */
    public static <T> RestResponse<T> error(String msg) {
        return new RestResponse<>(-1, msg);
    }

    /**
     * 错误信息的封装
     *
     * @param msg 错误信息
     * @param <T> 数据泛型
     * @return RestResponse
     */
    public static <T> RestResponse<T> error(T result, String msg) {
        return new RestResponse<>(-1, msg, result);
    }

    /**
     * 添加正常响应数据（包含响应内容）
     *
     * @param result 响应内容
     * @return RestResponse Rest服务封装相应数据
     */
    public static <T> RestResponse<T> success(T result) {
        return new RestResponse<>(result);
    }

    /**
     * 添加正常响应数据（包含响应内容）
     *
     * @param msg    提示信息
     * @param result 响应内容
     * @return RestResponse Rest服务封装相应数据
     */
    public static <T> RestResponse<T> success(T result, String msg) {
        return new RestResponse<>(0, msg, result);
    }

    /**
     * 添加正常响应数据（不包含响应内容）
     *
     * @return RestResponse Rest服务封装相应数据
     */
    public static <T> RestResponse<T> success() {
        return new RestResponse<T>();
    }

    /**
     * 判断是否成功
     *
     * @return Boolean true表示成功，false表示失败
     */
    public Boolean isSuccessful() {
        return this.code == 0;
    }
}